//
// Created by SDSC\202100300261 on 23-11-13.
//

#ifndef COMPILER_BLOCK_H
#define COMPILER_BLOCK_H

#include "sym.h"
#include "TABLE.h"
#include "CodeTable.h"

class BLOCK {
public:
    BLOCK();
    BLOCK(std::vector<TOKEN*>* _tokens,CodeTable * _codeTable);
    TOKEN* getToken();//获取token,并且index++
    TOKEN* getNowToken();//获取当前token,不改变index
    static bool checkSym(TOKEN *token,SYMS sym);//检查token的sym是否符合预期
    static bool softCheck(TOKEN *token,SYMS sym);//检查token的sym是否符合预期,不符合不抛出异常
    void loadNum(const std::string& s);//由于var和const的lod方法不同，所以写个工具函数
/**
 * 文法解析部分
 */
    void execMain();//执行主程序
    int execSumPro();//执行分程序,返回值为分程序的入口地址
    void execSentence();//执行语句
    void execCondition();//执行条件
    void execExpr();//执行表达式
    void execItem();//执行项
    void execFactor();//执行因子
    void execConst();//执行常量说明部分
    void execVar();//执行变量说明部分
    void execPro();//执行过程说明部分
    void execAssign();//执行赋值语句
    void execIf();//执行条件语句
    void execWhile();//执行当型循环语句
    void execCall();//执行过程调用语句
    void execRead();//执行读语句
    void execWrite();//执行写语句
    void execBegin();//执行复合语句

    TABLE *table;
private:
    std::vector<TOKEN*> *tokens;
    int index;
    CodeTable *codeTable;
};


#endif //COMPILER_BLOCK_H
